package main

import (
	"embed"
	"fmt"
	"os"
	"path/filepath"
	"runtime"

	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

//go:embed database/sql.db
var dbFile embed.FS

// Record 定义数据库模型
type Record struct {
	gorm.Model
	FileType string `gorm:"file_type" form:"file_type" json:"file_type"`
	Url      string `gorm:"url" form:"url" json:"url"`
	BatchNO  string `gorm:"batch_no" form:"batch_no" json:"batch_no"`
}

// 业务参数
type Config struct {
	gorm.Model
	DocPath  string `gorm:"doc_path" form:"doc_path" json:"doc_path"`
	HtmlPath string `gorm:"html_path" form:"html_path" json:"html_path"`
}

// AI参数
type AIConfig struct {
	gorm.Model
	ApiKey string `gorm:"api_key" form:"api_key" json:"api_key"`
}

var DB *gorm.DB

// Setup 初始化数据库连接
func Setup() error {
	homeDir, err := os.UserHomeDir()
	if err != nil {
		return fmt.Errorf("failed to get user home directory: %v", err)
	}

	// 根据操作系统选择数据库存储路径
	var dbDir string
	switch runtime.GOOS {
	case "windows":
		dbDir = filepath.Join(homeDir, "AppData", "Local", "wails-app", "database")
	case "darwin":
		dbDir = filepath.Join(homeDir, "Library", "Application Support", "wails-app", "database")
	default:
		return fmt.Errorf("unsupported operating system: %s", runtime.GOOS)
	}

	// 数据库文件路径
	dbPath := filepath.Join(dbDir, "sql.db")

	// 检查目标目录是否存在，如果不存在则创建
	if _, err := os.Stat(dbDir); os.IsNotExist(err) {
		if err := os.MkdirAll(dbDir, 0755); err != nil {
			return fmt.Errorf("failed to create database directory: %v", err)
		}
	}
	// 使用目标路径初始化 SQLite 数据库
	db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
	if err != nil {
		return fmt.Errorf("Failed to open database: %v", err)
	}
	DB = db
	fmt.Println("从嵌入文件初始化数据库成功!")

	// 自动迁移数据库表结构
	if err := DB.AutoMigrate(&Record{}); err != nil {
		return fmt.Errorf("自动迁移失败: %v", err)
	}
	if err := DB.AutoMigrate(&Config{}); err != nil {
		return fmt.Errorf("自动迁移失败: %v", err)
	}
	if err := DB.AutoMigrate(&AIConfig{}); err != nil {
		return fmt.Errorf("自动迁移失败: %v", err)
	}
	config := Config{}
	DB.Model(&Config{}).First(&config)
	if config.ID == 0 {
		DB.Model(&Config{}).Create(&Config{
			DocPath:  DocPrefix,
			HtmlPath: HtmlPrefix,
		})
	}
	ai_config := AIConfig{}
	DB.Model(&AIConfig{}).First(&ai_config)
	if ai_config.ID == 0 {
		DB.Model(&AIConfig{}).Create(&AIConfig{
			ApiKey: APIKEY,
		})
	}
	fmt.Println("自动迁移成功!")

	return nil
}
